/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <stdint.h>
#include <stdbool.h>
#include <utils/util.h>

#define GPIO_PADDR_BASE    0x6000D000
#define TK1_GPIO_PADDR         (GPIO_PADDR_BASE)
#define TK1_GPIO_SIZE          (0x1000)

enum gpio_pad_mode {
    GPIO_MODE = 0,
    SFIO_MODE
};

enum gpio_pin {
    GPIO_PA0 = 0,    /* pin 0 */
    GPIO_PA1,
    GPIO_PA2,
    GPIO_PA3,
    GPIO_PA4,
    GPIO_PA5,
    GPIO_PA6,
    GPIO_PA7,
    GPIO_PB0 = 8,    /* pin 8 */
    GPIO_PB1,
    GPIO_PB2,
    GPIO_PB3,
    GPIO_PB4,
    GPIO_PB5,
    GPIO_PB6,
    GPIO_PB7,
    GPIO_PC0,    /* pin 16 */
    GPIO_PC1,
    GPIO_PC2,
    GPIO_PC3,
    GPIO_PC4,
    GPIO_PC5,
    GPIO_PC6,
    GPIO_PC7,
    GPIO_PD0,    /* pin 24 */
    GPIO_PD1,
    GPIO_PD2,
    GPIO_PD3,
    GPIO_PD4,
    GPIO_PD5,
    GPIO_PD6,
    GPIO_PD7,
    GPIO_PE0,    /* pin 32 */
    GPIO_PE1,
    GPIO_PE2,
    GPIO_PE3,
    GPIO_PE4,
    GPIO_PE5,
    GPIO_PE6,
    GPIO_PE7,
    GPIO_PF0,    /* pin 40 */
    GPIO_PF1,
    GPIO_PF2,
    GPIO_PF3,
    GPIO_PF4,
    GPIO_PF5,
    GPIO_PF6,
    GPIO_PF7,
    GPIO_PG0,    /* pin 48 */
    GPIO_PG1,
    GPIO_PG2,
    GPIO_PG3,
    GPIO_PG4,
    GPIO_PG5,
    GPIO_PG6,
    GPIO_PG7,
    GPIO_PH0,    /* pin 56 */
    GPIO_PH1,
    GPIO_PH2,
    GPIO_PH3,
    GPIO_PH4,
    GPIO_PH5,
    GPIO_PH6,
    GPIO_PH7,
    GPIO_PI0,    /* pin 64 */
    GPIO_PI1,
    GPIO_PI2,
    GPIO_PI3,
    GPIO_PI4,
    GPIO_PI5,
    GPIO_PI6,
    GPIO_PI7,
    GPIO_PJ0,    /* pin 72 */
    GPIO_PJ1,
    GPIO_PJ2,
    GPIO_PJ3,
    GPIO_PJ4,
    GPIO_PJ5,
    GPIO_PJ6,
    GPIO_PJ7,
    GPIO_PK0,    /* pin 80 */
    GPIO_PK1,
    GPIO_PK2,
    GPIO_PK3,
    GPIO_PK4,
    GPIO_PK5,
    GPIO_PK6,
    GPIO_PK7,
    GPIO_PL0,    /* pin 88 */
    GPIO_PL1,
    GPIO_PL2,
    GPIO_PL3,
    GPIO_PL4,
    GPIO_PL5,
    GPIO_PL6,
    GPIO_PL7,
    GPIO_PM0,    /* pin 96 */
    GPIO_PM1,
    GPIO_PM2,
    GPIO_PM3,
    GPIO_PM4,
    GPIO_PM5,
    GPIO_PM6,
    GPIO_PM7,
    GPIO_PN0,    /* pin 104 */
    GPIO_PN1,
    GPIO_PN2,
    GPIO_PN3,
    GPIO_PN4,
    GPIO_PN5,
    GPIO_PN6,
    GPIO_PN7,
    GPIO_PO0,    /* pin 112 */
    GPIO_PO1,
    GPIO_PO2,
    GPIO_PO3,
    GPIO_PO4,
    GPIO_PO5,
    GPIO_PO6,
    GPIO_PO7,
    GPIO_PP0,    /* pin 120 */
    GPIO_PP1,
    GPIO_PP2,
    GPIO_PP3,
    GPIO_PP4,
    GPIO_PP5,
    GPIO_PP6,
    GPIO_PP7,
    GPIO_PQ0,    /* pin 128 */
    GPIO_PQ1,
    GPIO_PQ2,
    GPIO_PQ3,
    GPIO_PQ4,
    GPIO_PQ5,
    GPIO_PQ6,
    GPIO_PQ7,
    GPIO_PR0,    /* pin 136 */
    GPIO_PR1,
    GPIO_PR2,
    GPIO_PR3,
    GPIO_PR4,
    GPIO_PR5,
    GPIO_PR6,
    GPIO_PR7,
    GPIO_PS0,    /* pin 144 */
    GPIO_PS1,
    GPIO_PS2,
    GPIO_PS3,
    GPIO_PS4,
    GPIO_PS5,
    GPIO_PS6,
    GPIO_PS7,
    GPIO_PT0,    /* pin 152 */
    GPIO_PT1,
    GPIO_PT2,
    GPIO_PT3,
    GPIO_PT4,
    GPIO_PT5,
    GPIO_PT6,
    GPIO_PT7,
    GPIO_PU0,    /* pin 160 */
    GPIO_PU1,
    GPIO_PU2,
    GPIO_PU3,
    GPIO_PU4,
    GPIO_PU5,
    GPIO_PU6,
    GPIO_PU7,
    GPIO_PV0,    /* pin 168 */
    GPIO_PV1,
    GPIO_PV2,
    GPIO_PV3,
    GPIO_PV4,
    GPIO_PV5,
    GPIO_PV6,
    GPIO_PV7,
    GPIO_PW0,    /* pin 176 */
    GPIO_PW1,
    GPIO_PW2,
    GPIO_PW3,
    GPIO_PW4,
    GPIO_PW5,
    GPIO_PW6,
    GPIO_PW7,
    GPIO_PX0,    /* pin 184 */
    GPIO_PX1,
    GPIO_PX2,
    GPIO_PX3,
    GPIO_PX4,
    GPIO_PX5,
    GPIO_PX6,
    GPIO_PX7,
    GPIO_PY0,    /* pin 192 */
    GPIO_PY1,
    GPIO_PY2,
    GPIO_PY3,
    GPIO_PY4,
    GPIO_PY5,
    GPIO_PY6,
    GPIO_PY7,
    GPIO_PZ0,    /* pin 200 */
    GPIO_PZ1,
    GPIO_PZ2,
    GPIO_PZ3,
    GPIO_PZ4,
    GPIO_PZ5,
    GPIO_PZ6,
    GPIO_PZ7,
    GPIO_PAA0,    /* pin 208 */
    GPIO_PAA1,
    GPIO_PAA2,
    GPIO_PAA3,
    GPIO_PAA4,
    GPIO_PAA5,
    GPIO_PAA6,
    GPIO_PAA7,
    GPIO_PBB0,    /* pin 216 */
    GPIO_PBB1,
    GPIO_PBB2,
    GPIO_PBB3,
    GPIO_PBB4,
    GPIO_PBB5,
    GPIO_PBB6,
    GPIO_PBB7,
    GPIO_PCC0,    /* pin 224 */
    GPIO_PCC1,
    GPIO_PCC2,
    GPIO_PCC3,
    GPIO_PCC4,
    GPIO_PCC5,
    GPIO_PCC6,
    GPIO_PCC7,
    GPIO_PDD0,    /* pin 232 */
    GPIO_PDD1,
    GPIO_PDD2,
    GPIO_PDD3,
    GPIO_PDD4,
    GPIO_PDD5,
    GPIO_PDD6,
    GPIO_PDD7,
    GPIO_PEE0,    /* pin 240 */
    GPIO_PEE1,
    GPIO_PEE2,
    GPIO_PEE3,
    GPIO_PEE4,
    GPIO_PEE5,
    GPIO_PEE6,
    GPIO_PEE7,
    GPIO_PFF0,    /* pin 248 */
    GPIO_PFF1,
    GPIO_PFF2,
    GPIO_PFF3,
    GPIO_PFF4,
    GPIO_PFF5,
    GPIO_PFF6,
    GPIO_PFF7,    /* pin 255 */
    GPIOPORT_NONE,
};

#define MAX_GPIO_ID GPIO_PFF7

/** Statically initializes a mux_sys for the TK1 SoC.
 *
 * Usually a GPIO driver would depend on a mux driver, but on the TK1, it is the
 * other way around: curiously, on the TK1, the mux driver depends on the GPIO
 * driver because the GPIO controller sets the pin mode (SFIO vs MPIO mode),
 * and the GPIO controller also has the "lock" and "enable" bits for the pins.
 */
int gpio_init(volatile void *vaddr, gpio_sys_t *gpio_sys);
